//n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 
//
// 你需要按照以下要求，给这些孩子分发糖果： 
//
// 
// 每个孩子至少分配到 1 个糖果。 
// 相邻两个孩子评分更高的孩子会获得更多的糖果。 
// 
//
// 请你给每个孩子分发糖果，计算并返回需要准备的 最少糖果数目 。 
//
// 
//
// 示例 1： 
//
// 
//输入：ratings = [1,0,2]
//输出：5
//解释：你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。
// 
//
// 示例 2： 
//
// 
//输入：ratings = [1,2,2]
//输出：4
//解释：你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。
//     第三个孩子只得到 1 颗糖果，这满足题面中的两个条件。 
//
// 
//
// 提示： 
//
// 
// n == ratings.length 
// 1 <= n <= 2 * 10⁴ 
// 0 <= ratings[i] <= 2 * 10⁴ 
// 
// Related Topics 贪心 数组 👍 830 👎 0

package leetcode.editor.cn;

import java.util.Arrays;

class Candy {
    public static void main(String[] args) {
        Solution solution = new Candy().new Solution();
        solution.candy(new int[]{1, 3, 4, 5, 2});
    }

    //leetcode submit region begin(Prohibit modification and deletion)

    class Solution {
        // 两次贪心的策略
        // 一次是从左到右遍历，只比较右边孩子评分比左边大的情况。
        // 一次是从右到左遍历，只比较左边孩子评分比右边大的情况。
        // 这样从局部最优推出了全局最优，即：相邻的孩子中，评分高的孩子获得更多的糖果。
        public int candy(int[] ratings) {
            int res = 0;
            int[] arr = new int[ratings.length];
            Arrays.fill(arr, 1);
            for (int i = 0; i < ratings.length; i++) {
                if (i > 0 && ratings[i] > ratings[i - 1]) arr[i] = arr[i - 1] + 1;
            }

            for (int i = ratings.length - 1; i >= 0; i--) {
                if (i > 0 && ratings[i] < ratings[i - 1]) arr[i - 1] = Math.max(arr[i] + 1, arr[i - 1]);
            }

            for (int i : arr) {
                res += i;
            }
            return res;
        }

    }
//leetcode submit region end(Prohibit modification and deletion)

}
